package com.sun.api;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
public class RedisTemplateList {

    @Autowired
    private RedisTemplate redisTemplate;
    @GetMapping("/list")
    public String testList(){
        // 向列表中头部添加元素
        redisTemplate.opsForList().leftPush("list", "第一个list元素");
        // 通过index获取列表中的元素
        System.out.println(redisTemplate.opsForList().index("list", 0));

        // 把多个值存入列表头部
        redisTemplate.opsForList().leftPushAll("list", "第二个list元素", "第三个list元素", "第四个list元素");

        // 获取列表指定范围内元素，start起始位置，end结束位置，-1返回所有
        System.out.println(redisTemplate.opsForList().range("list", 0, 3));

        // list存在的时候再加入
        redisTemplate.opsForList().leftPushIfPresent("list", "第六个list元素");
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));

        // 在pivot值存在时在pivot前面添加
        redisTemplate.opsForList().leftPush("list", "第六个list元素", "第五个半list元素");
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));

        // 按照先进先出的原则添加多个值
        redisTemplate.opsForList().rightPush("list", "第七个list元素");
        redisTemplate.opsForList().rightPushAll("list", "第八个list元素", "第九个list元素");
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));

        // 在pivot右边添加值
        redisTemplate.opsForList().rightPush("list", "第七个list元素", "第七个半list元素");
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));

        // 设置指定索引处元素的值
        redisTemplate.opsForList().set("list", 5, "修改后的list元素");

        // 移除并获取列表中第一个元素
        System.out.println(redisTemplate.opsForList().leftPop("list"));
        System.out.println(redisTemplate.opsForList().leftPop("list", 10, TimeUnit.SECONDS));

        // 移除并获取列表中最后一个元素
        System.out.println(redisTemplate.opsForList().rightPop("list"));
        System.out.println(redisTemplate.opsForList().rightPop("list", 8, TimeUnit.SECONDS));

        // 从一个列表右边弹出一个元素并将该元素插入另一个列表的左边
        redisTemplate.opsForList().rightPopAndLeftPush("list", "list2");
        redisTemplate.opsForList().rightPopAndLeftPush("list", "list2", 10, TimeUnit.SECONDS);

        // 删除列表中值等于指定value的元素，index=0删除所有，index>0删除头部开始第一个，index<0删除尾部开始第一个
        redisTemplate.opsForList().remove("list", 0, "第三个list元素");
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));

        // 列表进行裁剪
        redisTemplate.opsForList().trim("list", 1, 4);
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));

        // 获取当前列表长度
        System.out.println(redisTemplate.opsForList().size("list"));

        return null;
    }
}
